本文介绍python中的类属性和实例属性的相关知识。
首先是什么是类和实例:
类是对一类具有相同属性的对象的抽象。
实例是根据类创建出来的一个个具体的“对象”。一个类可以实例化出多个实例。
__author__ = "Allen Liu"
__time__ = "2017/8/2"
'''This is an example ... '''
class dog(object):
leg_num = 4
d1 = dog
d2 = dog
print(d1.leg_num)#输出4
print(d2.leg_num)#输出4
上面我们定义了一个类(dog),d1,d2为这个类的两个实例。
下面介绍类属性和实例属性:
类属性在类内定义(一般在类的开始),在__init__函数外面。一般是类所共有的属性定义为类属性。
在类内部用类名.类属性名调用,外部既可以用类名.类属性名又可以用实例名.类属性名来调用。
实例属性一般在类中的函数中定义,实例属性可能为某个实例独有。内部调用时为self.实例属性名,外部调用时用实例名.实例属性名。
举例说明:
__author__ = "Allen Liu"
__time__ = "2017/8/2"
'''This is an example ... '''
class dog(object):
leg_num = 4 #类属性
def __init__(self,name,age):
self.name = name #实例属性
self.age = age #实例属性
d1 = dog('大黄',1)# 实例化
d2 = dog('小黑',2)
print(d1.leg_num)#输出4
print(d2.leg_num)#输出4
print(d1.name,d1.age)#输出‘大黄 1’
print(d2.name,d2.age)#输出‘小黑 2’
修改类属性的值:类名.类属性名 = 属性值。不能通过实例修改类属性的值。
修改类属性的值:实例名.实例属性 = 属性值。
下面介绍下动态添加实例属性:
可以通过(实例名.实例属性名 = 属性值)的方式添加实例属性,例如在上面的代码下加上下面代码:
d1.skin = '黑色'
print(d1.skin)#输出‘黑色’
如果试图通过实例修改类属性的值
__author__ = "Allen Liu"
__time__ = "2017/8/2"
'''This is an example ... '''
class dog(object):
leg_num = 4 #类属性
def __init__(self,name,age):
self.name = name #实例属性
self.age = age #实例属性
d1 = dog('大黄',1)# 实例化
d1.leg_num = 3
print(d1.leg_num,dog.leg_num)#输出为3,4
这时候发现类属性的值并没有改变,但是实例中该属性的值变了。
首先说下类访问一个属性时的查找顺序:在实例中访问一个属性,会先查找实例属性然后才是类属性。当我试图用实例去修改一个在类中不可变的属性的时候,我实际上并没有修改,而是在我的实例中创建了这个属性。而当我再次访问这个属性的时候,我实例中有,就不用去类中寻找了。